/**
 * 
 */
package br.com.iplant.dao;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

/**
 * @author hfernandes
 * 
 */
public abstract class HibernateDAOImpl<E, H, I> {
//	public static final int OP_EQUAL=0;
//	public static final int OP_OR=1;
//	public static final int OP_LIKE=2;
//	@SuppressWarnings("unused")
//	private static  Session session=null;
//	@SuppressWarnings("rawtypes")
//	private Class classe;
//	
//	@SuppressWarnings("unchecked")
//	public HibernateDAOImpl() {
//		super();
//		this.classe = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
//		System.out.println(classe);
//	}
//	
//	public boolean salvar(E obj) {
////		Transaction tx = null;
//		// try {
//
//		HibernateUtil.getCurrentSession().flush();
//		HibernateUtil.getCurrentSession().clear();
//		HibernateUtil.doBeginTransaction();
//		// tx = getSession().getTransaction();
//
//		// getSession().merge(obj);
//		getSession().saveOrUpdate(obj);
//
//		HibernateUtil.doCommit();
//		// tx.commit();
//		// HibernateUtil.getThreadtransaction().get().commit();
//
//		// } catch (Exception e) {
//		// tx.rollback();
//		// HibernateUtil.doRollback();
//		// e.printStackTrace();
//		// } finally {
//
//		// }
//
//		return true;
//	}
//	/**
//	 * 
//	 * @param H obj
//	 * @return
//	 */
//
//	public boolean salvarObjeto(H obj) {
////		Transaction tx = null;
//		try {
//
//			HibernateUtil.doBeginTransaction();
//			// tx = getSession().beginTransaction();
//
//			getSession().saveOrUpdate(obj);
//			HibernateUtil.doCommit();
//		} catch (Exception e) {
//			// tx.rollback();
//			HibernateUtil.doRollback();
//			e.printStackTrace();
//		} finally {
//
//		}
//
//		return true;
//	}
//
//	public boolean salvarObjeto2(I obj) {
////		Transaction tx = null;
//		try {
//			HibernateUtil.getCurrentSession().flush();
//			HibernateUtil.getCurrentSession().clear();
//			HibernateUtil.doBeginTransaction();
//			// tx = getSession().beginTransaction();
//
//			getSession().saveOrUpdate(obj);
//		  HibernateUtil.doCommit();
//		} catch (Exception e) {
//			// tx.rollback();
//			HibernateUtil.doRollback();
//			e.printStackTrace();
//		} finally {
//
//		}
//
//		return true;
//	}
//
//	public boolean excluir(E obj) {
//
//		//Transaction tx = null;
//		try {
//			HibernateUtil.doBeginTransaction();
//
//			getSession().delete(obj);
//		//	HibernateUtil.doCommit();
//			return true;
//		} catch (Exception e) {
//
//			e.printStackTrace();
//		} finally {
//
//		}
//		return false;
//	}
//
//	public boolean excluirObjecto(H obj) {
//		Transaction tx = null;
//		try {
//			tx = getSession().beginTransaction();
//			getSession().delete(obj);
//			tx.commit();
//		} catch (Exception e) {
//			tx.rollback();
//			e.printStackTrace();
//		} finally {
//		}
//
//		return tx.wasCommitted();
//	}
//
//	public Session getSession() {
//		//return HibernateUtil.getCurrentSession();
//	}
//	
//	
//	@SuppressWarnings("unchecked")
//	public E getObjetoPelaChave(Integer key) {
//		return (E) getSession().get(classe, key);
//	}
//	
//	
//	@SuppressWarnings("unchecked")
//	public List<E> findAll() {
//		getSession().beginTransaction();
//		Criteria criteria = getSession().createCriteria(classe);
//		//criteria.addOrder(Order.asc("nome"));
//		return criteria.list();
//	}
//	
//	/**
//	 * 
//	 * @see 	 * 
//	 *  <code>HibernateDAOImpl<Usuario, Object, Object> impl = new HibernateDAOImpl<Usuario, Object, Object>() {
//		};
//		System.out.println(impl.findBy("login", "root", HibernateDAOImpl.OP_EQUAL).getNome());
//		</code>
//	 * @param property - campo pesquisado
//	 * @param value - valor pesquisado
//	 * @param operador neste caso so e possivel HibernateDAOImpl.OP_EQUAL ou HibernateDAOImpl.OP_LIKE
//	 * @return se encontrar o objeto do tipo E ou null caso contrario
//	 */
//	@SuppressWarnings("unchecked")
//	public E findBy(String property, String value, int operador) {
//		getSession().beginTransaction();
//		Criteria criteria = getSession().createCriteria(classe);
//		switch (operador) {
//		case OP_EQUAL:
//			criteria.add(Restrictions.eq(property, value));	
//			break;
//		case OP_LIKE:
//			criteria.add(Restrictions.like(property, value));	
//			break;
//		default:
//			break;
//		}				
//		return (E) criteria.uniqueResult();
//	}
//	
//	
//	
//	@SuppressWarnings("unchecked")
//	public List<E> findAllBy(String property, String value, int operador) {
//		getSession().beginTransaction();
//		Criteria criteria = getSession().createCriteria(classe);
//		switch (operador) {
//		case OP_EQUAL:
//			criteria.add(Restrictions.eq(property, value));	
//			break;
//		case OP_LIKE:
//			criteria.add(Restrictions.like(property, value));	
//			break;
//		default:
//			break;
//		}		
//		return criteria.list();
//	}

}
